/**
 * JMS规范中的消息类型：TextMessage、MapMessage、ObjectMessage、BytesMessage和StreamMessage等五种
 * 1.建立ConnectionFactory工厂对象，需要填入用户名、密码、连接地址（一般使用默认，如果没有修改的话）
 * 2.创建一个Connection连接，并且调用Connection的start方法开启连接，Connection方法默认是关闭的
 * 3.创建Session会话(connection.createSession)，用于接收消息，参数1是是否启用事务，参数2是签收模式，一般设置为自动签收
 * 4.创建Destination队列(session.createTopic)，指的是一个客户端用来制定生产消息目标和消费消息来源的对象。在PTP的模式中，Destination被称作队列，在Pub/Sub模式中，Destination被称作主题（Topic）
 * 5.创建消息消费者MessageConsumer (session.createConsumer)
 * 6.接收消息(consumer.receive或者consumer.setMessageListener)
 * 7.释放资源 consumer.close、session.close、connection.close
 */
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
import java.io.IOException;

public class TopicReceiver {
    public static void main(String[] args) throws JMSException, IOException {
        Connection connection = null;
        Session session = null;
        MessageConsumer consumer = null;
        /*等效替换
        TopicConnection connection = null;
        TopicSession session = null;
        TopicSubscriber consumer = null*/
        try {
            // 创建一个ConnectionFactory对象连接MQ服务器
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            // 创建一个连接对象
            connection = connectionFactory.createConnection();
            // 开启连接
            connection.start();
            // 使用Connection对象创建一个Session对象
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            // 创建一个Destination对象。topic对象
            Topic topic = session.createTopic("mytopic");
            // 使用Session对象创建一个消费者对象。
            consumer = session.createConsumer(topic);
        /*等效替换
            TopicConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
            connection = factory.createTopicConnection();
            connection.start();
            session = connection.createTopicSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
            Topic topic = session.createTopic("mytopic");
            consumer = session.createSubscriber(topic);;
         */
            // 异步接收消息
            consumer.setMessageListener(new MessageListener() {
                @Override
                public void onMessage(Message message) {
                    // 打印结果
                    TextMessage textMessage = (TextMessage) message;
                    String text;
                    try {
                        text = textMessage.getText();
                        System.out.println("从Topic收到的消息：" + text);
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }

                }
            });
            System.out.println("Topic消费者启动......");
            // 休眠100ms再关闭
            Thread.sleep(1000 * 100);

            // 提交会话
            session.commit();

        } catch (Exception e) {
           e.printStackTrace();
        } finally {
            //9. 关闭释放资源
            if (consumer != null) {
                consumer.close();
            }
            if (session != null) {
                session.close();
            }
            if (connection != null) {
                connection.close();
            }
        }
    }
}
